// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本，
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3

package 进程类

import (
	"os"

	gmap "gitee.com/go_888/goframe/container/gmap"
	gerror "gitee.com/go_888/goframe/errors/gerror"
)

// X结构_Manager 是一个管理多个进程的进程管理器。 md5:608ec304d3cca78a
type X结构_Manager struct {
	processes *gmap.X结构_IntAnyMap // 进程ID到进程对象的映射。 md5:e1aabd18695c16fa
}

// X创建进程管理 创建并返回一个新的进程管理器。 md5:bfef06576c70f94f
func X创建进程管理() *X结构_Manager {
	return &X结构_Manager{
		processes: gmap.X创建IntAny(true),
	}
}

// X创建进程 创建并返回一个进程对象。 md5:41e1fd6b109e05e7
func (m *X结构_Manager) X创建进程(路径 string, 参数 []string, environment []string) *X结构_进程 {
	p := X创建进程(路径, 参数, environment)
	p.Manager = m
	return p
}

// X取进程对象 获取并返回一个Process对象。
// 如果找不到具有给定`pid`的进程，它将返回nil。
// md5:d5b11d4d0e9fa1a3
func (m *X结构_Manager) X取进程对象(进程ID int) *X结构_进程 {
	if v := m.processes.X取值(进程ID); v != nil {
		return v.(*X结构_进程)
	}
	return nil
}

// X加入进程ID 向当前管理器添加一个进程。
// 如果给定的 `pid` 对应的进程不存在，它不会做任何操作。
// md5:c51d5832fb1ce691
func (m *X结构_Manager) X加入进程ID(进程ID int) {
	if m.processes.X取值(进程ID) == nil {
		if process, err := os.FindProcess(进程ID); err == nil {
			p := m.X创建进程("", nil, nil)
			p.Process = process
			m.processes.X设置值(进程ID, p)
		}
	}
}

// X删除进程ID 从当前管理器中移除一个进程。 md5:0076407de3a7d26a
func (m *X结构_Manager) X删除进程ID(进程ID int) {
	m.processes.X删除(进程ID)
}

// X取所有进程 获取并返回当前管理器中的所有进程。 md5:30ac76e5c68d45de
func (m *X结构_Manager) X取所有进程() []*X结构_进程 {
	processes := make([]*X结构_进程, 0)
	m.processes.X遍历读锁定(func(m map[int]interface{}) {
		for _, v := range m {
			processes = append(processes, v.(*X结构_进程))
		}
	})
	return processes
}

// X取所有进程ID 获取并返回当前管理器中的所有进程ID数组。 md5:a5ef21ec52c87400
func (m *X结构_Manager) X取所有进程ID() []int {
	return m.processes.X取所有名称()
}

// X等待所有进程退出等待直到所有进程退出。 md5:1d27f65463fe8c00
func (m *X结构_Manager) X等待所有进程退出() {
	processes := m.X取所有进程()
	if len(processes) > 0 {
		for _, p := range processes {
			_ = p.Wait()
		}
	}
}

// X结束所有进程 在当前管理器中杀死所有进程。 md5:337f683854b75187
func (m *X结构_Manager) X结束所有进程() error {
	for _, p := range m.X取所有进程() {
		if err := p.X结束进程(); err != nil {
			return err
		}
	}
	return nil
}

// X发送所有进程信号 向当前管理器中的所有进程发送信号 `sig`。 md5:64ce0027dcad8808
func (m *X结构_Manager) X发送所有进程信号(信号 os.Signal) error {
	for _, p := range m.X取所有进程() {
		if err := p.X发送信号(信号); err != nil {
			err = gerror.X多层错误并格式化(err, `向 PID "%d" 的进程发送信号 "%s" 失败`, p.Process.Pid, 信号)
			return err
		}
	}
	return nil
}

// X发送所有进程数据 将数据字节发送到当前管理器中的所有进程。 md5:05d5ed3b0a5c7e3e
func (m *X结构_Manager) X发送所有进程数据(字节集 []byte) {
	for _, p := range m.X取所有进程() {
		_ = p.X发送数据(字节集)
	}
}

// X发送数据 向当前管理器中的指定进程发送数据字节。 md5:b477f09d2f5cca5f
func (m *X结构_Manager) X发送数据(进程ID int, 数据 []byte) error {
	return X发送数据(进程ID, 数据)
}

// X清空所有进程 会清除当前管理器中的所有进程。 md5:26053a86c2f65b33
func (m *X结构_Manager) X清空所有进程() {
	m.processes.X清空()
}

// X取成员数 返回当前管理器中进程的数量。 md5:ffaeaa3ed9b66ed1
func (m *X结构_Manager) X取成员数() int {
	return m.processes.X取成员数()
}
